﻿using GalaSoft.MvvmLight;
using System.Collections.Generic;
using db;
using dominio;
using System.Collections.ObjectModel;
using SGTv2.Model;
using GalaSoft.MvvmLight.Messaging;
using GalaSoft.MvvmLight.Command;
using System;

namespace SGTv2.ViewModel
{
    /// <summary>
    /// This class contains properties that the main View can data bind to.
    /// <para>
    /// Use the <strong>mvvminpc</strong> snippet to add bindable properties to this ViewModel.
    /// </para>
    /// <para>
    /// You can also use Blend to data bind with the tool's support.
    /// </para>
    /// <para>
    /// See http://www.galasoft.ch/mvvm/getstarted
    /// </para>
    /// </summary>
    public class MainViewModel : ViewModelBase, IObserver<object>
    {
        private ObservableCollection<Remito> _remitos;
        private Deposito _depositoActual;
        private ObservableCollection<ArbolViewModel> _nodosArbol;
        private ObservableCollection<ArbolViewModel> _nodosArbolFecha;
        private ObservableCollection<Deposito> _depositos;
        private ArbolViewModel _raizArbol;
        private ArbolViewModel _raizArbolFecha;
        private Messenger _mensajero = Messenger.Default;
        public RelayCommand abrirVentanaRemitoCommand { get; private set; }
        public RelayCommand abrirVentanaDepositoCommand { get; private set; }
        private Sector _sectorSeleccionado;
        private Uri _ContenidoPagina;

        public ObservableCollection<Remito> RemitosRecientes
        {
            get { return _remitos; }
            set
            {
                _remitos = value;
                RaisePropertyChanged("RemitosRecientes");
               
            }
        }
        public Deposito DepositoActual
        {
            get { return _depositoActual; }
            set
            {
                _depositoActual = value;
                setDepositoActual();
            }
        }

        public ObservableCollection<ArbolViewModel> NodosArbol
        {
            get { return _nodosArbol; }
            set
            {
                _nodosArbol = value;
                RaisePropertyChanged("NodosArbol");

            }
        }

        public ObservableCollection<ArbolViewModel> NodosArbolFecha
        {
            get { return _nodosArbolFecha; }
            set
            {
                _nodosArbolFecha = value;
                RaisePropertyChanged("NodosArbolFecha");

            }
        }


        public ObservableCollection<Deposito> Depositos
        {
            get { return _depositos; }
            set
            {
                _depositos = value;
                RaisePropertyChanged("Depositos");

            }
        }
        public Uri ContenidoPagina
        {
            get { return _ContenidoPagina; }
            set
            {
                _ContenidoPagina = value;
                RaisePropertyChanged("ContenidoPagina");
            }
        }

        /// <summary>
        /// Initializes a new instance of the MainViewModel class.
        /// </summary>
        public MainViewModel()
        {
            if (IsInDesignMode)
            {
                // Code runs in Blend --> create design time data.
            }
            else
            {
                inicializacion();
            }
        }


        private void inicializacion()
        {
            Sistema.getInstance().Subscribe(this);
            
            _depositoActual = Sistema.getInstance().GetDepositoActual();
            
           /* Sector o = null;
            foreach (Sector s in _depositoActual.getSectores())
            {
                if (o == null)
                    o = s;
            }
            //RemitosRecientes = Sistema.getInstance().getRemitosSector(o);*/
            cargarArbol();
            cargarArbolFechas();
            Messenger.Default.Register<Mensaje>(this, msg => procesarMensaje(msg));
            cargarComandos();
            Depositos = Sistema.getInstance().Depositos;
            ContenidoPagina = new Uri("/Views/Pages/GridPrincipalPage.xaml", UriKind.Relative);
            
        }

        private void cargarArbol()
        {
            //Creo el arbol de sectores
            _raizArbol = new ArbolViewModel(ManejadorUI.getInstance().GetArbol());

            NodosArbol = new ObservableCollection<ArbolViewModel>(
                new ArbolViewModel[] 
                { 
                    _raizArbol 
                });
            //Fin arbol de sectores
        }

        private void cargarArbolFechas()
        {
            //Creo el arbol de fechas
            _raizArbolFecha = new ArbolViewModel(ManejadorUI.getInstance().GetArbolCalendario());

            NodosArbolFecha = new ObservableCollection<ArbolViewModel>(
                new ArbolViewModel[] 
                { 
                    _raizArbolFecha 
                });
            //Fin arbol de fechas
        }

        private void procesarMensaje(Mensaje msg)
        {
            
            switch (msg.par1)
            {
                case 0:
                    {
                        _sectorSeleccionado = (Sector)msg.tag;
                        RemitosRecientes = Sistema.getInstance().getRemitosSector(_sectorSeleccionado);
                        if (!ContenidoPagina.OriginalString.Contains("GridPrincipalPage"))
                            ContenidoPagina = new Uri("/Views/Pages/GridPrincipalPage.xaml", UriKind.Relative);
                    }break;
                case 1:
                    {
                        _sectorSeleccionado = null;
                        DateTime ini = (DateTime)msg.tag;
                        DateTime fin = ((DateTime)msg.tag).AddMonths(1);
                        RemitosRecientes = Sistema.getInstance().getRemitosFecha(ini, fin);
                        if (!ContenidoPagina.OriginalString.Contains("GridPrincipalPage"))
                            ContenidoPagina = new Uri("/Views/Pages/GridPrincipalPage.xaml", UriKind.Relative);
                    }break;
                case 2:
                    {
                        if (!ContenidoPagina.OriginalString.Contains("DiaDeHoyPage"))
                        ContenidoPagina = new Uri("/Views/Pages/DiaDeHoyPage.xaml", UriKind.Relative);
                    }break;
            }
            
                
        }

        private void abrirVentanaRemito()
        {
            NuevoRemitoView ventana = new NuevoRemitoView();
            ventana.ShowDialog();
        }

        private void abrirVentanaDeposito()
        {
            NuevoDepositoView ventana = new NuevoDepositoView();
            ventana.ShowDialog();
        }


        public virtual void OnCompleted()
        {

        }
        public virtual void OnError(Exception e)
        {
        }
        public virtual void OnNext(Object value)
        {
            RemitosRecientes = Sistema.getInstance().getRemitosSector(_sectorSeleccionado);
        }


        private void setDepositoActual()
        {
            Sistema.getInstance().EstablecerDepositoActual(_depositoActual);
            cargarArbol();
        }



        private void cargarComandos()
        {
            abrirVentanaRemitoCommand = new RelayCommand(abrirVentanaRemito);
            abrirVentanaDepositoCommand = new RelayCommand(abrirVentanaDeposito);
        }






        public override void Cleanup()
        {
        ////    // Clean up if needed

           // base.Cleanup();
        }
    }
}